package main

import (
	"Learn/main/chatroom/common/message"
	"encoding/binary"
	"encoding/json"
	"fmt"
	"net"
)

func readPkg(accept net.Conn) (mes message.Message, err error) {
	buf := make([]byte, 8096)
	fmt.Println("读取客户端发送的数据")
	// 读前四个字节，在 conn 没有被关闭的情况下，才会阻塞
	_, err = accept.Read(buf[:4])
	if err != nil {
		fmt.Println("conn.Read err =", err)
		//err = errors.New("read pkg head err")
		return
	}
	fmt.Println("读到的buf=", buf)
	// 根据 buf[:4] 转成一个 uint32 类型
	var pkgLen uint32
	pkgLen = binary.BigEndian.Uint32(buf[0:4])
	// 读取信息
	n, err := accept.Read(buf[:pkgLen])
	if n != int(pkgLen) || err != nil {
		fmt.Println("conn.Read err =", err)
		//err = errors.New("read pkg body err")
		return
	}
	// 反序列化消息
	err = json.Unmarshal(buf[:pkgLen], &mes)
	if err != nil {
		fmt.Println("json.Unmarshal(buf[:pkgLen], &mes) err =", err)
		return
	}
	return
}

func writePkg(conn net.Conn, data []byte) (err error) {
	// 先发送一个长度给对方
	var pkglen uint32
	pkglen = uint32(len(data))
	var buf [4]byte
	binary.BigEndian.PutUint32(buf[0:4], pkglen)
	n, err := conn.Write(buf[:4])
	if n != 4 || err != nil {
		fmt.Println("conn.Write(buf) fail", err)
		return err
	}
	// 发送
	n, err = conn.Write(data)
	if n != int(pkglen) || err != nil {
		fmt.Println("conn.Write(data) fail", err)
		return err
	}
	return err
}

